iT邦幫忙

2022 iThome 鐵人賽

DAY 21
0
Software Development

Kotlin 程式人:Leetcode 意外旅程系列 第 21

Day 21:自主學習、linked list 和 scope function: 18、12、206

  • 分享至 

  • xImage
  •  

「夏姐!今天先等一下喔」菁菁開心的說

「嗯?」夏天嚇了一跳,難得今天的分享不是以自己打開題目開場。

「嘿嘿,我跟曉欣後來發現了,原來 leetcode 有一個『Similar Questions』的功能,所以我們自己嘗試解了幾題」菁菁跟曉欣打開了之前的答題紀錄:

18. 4Sum

class Solution {
    fun fourSum(nums: IntArray, target: Int): List<List<Int>> {
        val set = HashSet<List<Int>>()
        nums.sort()
        for (i in 0 until nums.size - 3) {
            for (j in i + 1 until nums.size - 2) {
                var left = j + 1
                var right = nums.size - 1
                while (left < right) {
                    val sum = nums[i] + nums[j] + nums[left] + nums[right]
                    when {
                        sum == target -> {
                            set.add(listOf(nums[i], nums[j], nums[left], nums[right]))
                            left++
                            right--
                        }

                        sum < target -> left++
                        else -> right--
                    }
                }
            }
        }
        return set.toList()
    }
}

「哇!這題你們怎麼想出來的!」

「沒有啦⋯⋯主要還是菁菁想到,其實這題跟 2 sum 有關。只要連續做兩次 2 sum 的邏輯,就差不多了」曉欣害羞的說。

雖然這樣說大致上也沒錯,4 sum 這題目其實還有很多細節需要考慮,從程式碼就可以看出兩人嘗試錯誤的痕跡。想到不知道兩人私下究竟花了多少時間,夏天不禁有點感動。

「還有這題」曉欣打開了另一題的紀錄

12. Integer to Roman

class Solution {
    fun intToRoman(num: Int): String {
        val romanList = listOf(
            1000 to "M",
            900 to "CM",
            500 to "D",
            400 to "CD",
            100 to "C",
            90 to "XC",
            50 to "L",
            40 to "XL",
            10 to "X",
            9 to "IX",
            5 to "V",
            4 to "IV",
            1 to "I"
        )
        var number = num
        var index = 0
        var str = ""
        while (number != 0) {
            if (number >= romanList[index].first) {
                val romanValue = romanList[index]
                number -= romanValue.first
                str += romanValue.second
            } else {
                index++
            }
        }
        return str
    }
}

要從原本的 13. Roman to Integer 推想出這題的解法,私下不知道花了多少時間。而且看得出曉欣現在對 Kotlin Collection 的掌握度,很可能比起一些剛學 Kotlin 的工程師還要好。

「今天本來想跟兩位介紹 linked list 這個資料結構的」 夏天打開原本為今天準備的題目 206. Reverse Linked List

「這跟 tree 很像耶」兩人看了一下註解的部分

/**
 * Example:
 * var li = ListNode(5)
 * var v = li.`val`
 * Definition for singly-linked list.
 * class ListNode(var `val`: Int) {
 *     var next: ListNode? = null
 * }
 */

「其實⋯⋯嗯,其實差不多」本來想糾正兩人觀念的夏天,突然覺得好像也沒必要多說。反正以兩人自學的速度,他們很快就會找到對 linked list 的說明文章了。

兩人花了一點時間,寫出下面的解答

class Solution {
    fun reverseList(head: ListNode?): ListNode? {
        var reversed: ListNode? = null
        
        var current = head
        while(current != null) {
            val temp = ListNode(current.`val`)
            temp.next = reversed
            reversed = temp
            current = current.next
        }
        
        return reversed
    }
}

「兩位太厲害了!」夏天非常開心。「那我順便分享一下 Kotlin Scope function 的用法」

class Solution {
    fun reverseList(head: ListNode?): ListNode? {
        var reversed: ListNode? = null
        var current = head

        while (current != null) {
            reversed = ListNode(current.`val`)
                .apply { next = reversed }
                .also { current = current!!.next }
        }

        return reversed
    }
}

「原來 Kotlin scope function 可以這樣用呀」看到 scope function 的用法,兩人不禁感嘆

「沒問題的,相信你們兩位很快就能學會的」夏天有信心的說


上一篇
Day 20:不需要提示的兩人:326、342、125
下一篇
Day 22:在 github 寫下答題紀錄:461、67、226、415
系列文
Kotlin 程式人:Leetcode 意外旅程30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言